package com.ddm.controller.vx;
import cn.binarywang.wx.miniapp.api.WxMaService;

import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ddm.constant.JwtClaimsConstant;
import com.ddm.dto.vxDTO.LoginDTO;

import com.ddm.dto.vxDTO.WechatPhoneLoginDTO;
import com.ddm.entity.vxEntity.User;
import com.ddm.properties.JwtProperties;
import com.ddm.properties.OpenProperties;
import com.ddm.result.Result;
import com.ddm.service.vxService.UserService;

import com.ddm.utils.JwtUtil;
import com.ddm.vo.LoginVO;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.HashMap;

@RestController
@RequestMapping("/user/user")
@Slf4j
public class LoginController {
    @Resource
    private WxMaService wxMaService;
    @Autowired
    UserService userService;
    @Autowired
    OpenProperties openProperties;
    @Autowired
    JwtProperties jwtProperties;

    /**
     *微信用户登录
     * 根据openid判断是否是第一次登录
     */

    @PostMapping("/login")
    @ApiOperation("微信用户登录")
    public Result<LoginVO> userLogin(@RequestBody LoginDTO loginDTO){
        log.info("微信登录：{}", loginDTO.getCode());

        User user = userService.vxLogin(loginDTO);

        //生产JWT令牌
        HashMap<String , Object> claims = new HashMap<>();
        claims.put(JwtClaimsConstant.USER_ID,user.getId());
        String token = JwtUtil.createJWT(openProperties.getAppSecret(), jwtProperties.getAdminTtl(), claims);
        LoginVO loginVO = LoginVO.builder()
                .id(user.getId())
                .openid(user.getOpenid())
                .token(token)
                .build();
        return Result.success(loginVO);
    }
//    /**
//     * 处理用户登录并解密手机号
//     * @param requestBody 包含登录所需参数的请求体
//     * @return 登录结果
//     */
//    @PostMapping("phone")
//    public Map<String, Object> login(@RequestBody Map<String, Object> requestBody) {
//        Map<String, Object> result = new HashMap<>(4);
//
//        try {
//            // 1. 获取请求参数
//            String code = (String) requestBody.get("code"); // 登录凭证
//            String encryptedData = (String) requestBody.get("encryptedData"); // 加密的手机号数据
//            String iv = (String) requestBody.get("iv"); // 解密向量
//            String avatar = (String) requestBody.get("avatar"); // 用户头像
//            String nickname = (String) requestBody.get("nickname"); // 用户名
//
//            // 2. 使用code获取sessionKey和openid
//            WxMaJscode2SessionResult sessionResult = wxMaService.getUserService().getSessionInfo(code);
//            String sessionKey = sessionResult.getSessionKey();
//            String openid = sessionResult.getOpenid();
//
//            // 3. 调用三参数版本的getPhoneNoInfo解密手机号
//            WxMaPhoneNumberInfo phoneInfo = wxMaService.getUserService()
//                    .getPhoneNoInfo(sessionKey, encryptedData, iv);
//            String phoneNumber = phoneInfo.getPhoneNumber();
//
//            // 4. 构建用户信息（实际应用中应保存到数据库）
//            Map<String, Object> userInfo = new HashMap<>(4);
//            userInfo.put("openid", openid);
//            userInfo.put("phoneNumber", phoneNumber);
//            userInfo.put("avatar", avatar);
//            userInfo.put("nickname", nickname);
//
//            // 5. 返回成功结果
//            result.put("success", true);
//            result.put("message", "登录成功");
//            result.put("user", userInfo);
//
//        } catch (Exception e) {
//            // 处理异常情况
//            result.put("success", false);
//            result.put("message", "登录失败: " + e.getMessage());
//            // 实际生产环境中可添加日志记录
//            // log.error("登录处理异常", e);
//        }
//
//        return result;
//    }

//    @PostMapping("/api/loginByPhone")
//    public Result<LoginVO> loginByPhone(@RequestBody LoginDTO request) throws Exception {
//        String code = request.getCode();
//        String phoneNumber = wechatService.getPhoneNumber(code);
//
//        // 查询用户是否存在
//        User user = userService.findUserByPhoneNumber(phoneNumber);
//        if (user == null) {
//            // 如果用户不存在，创建新用户
////            user = userService.createUser(phoneNumber);
//
//        }
//
////        // 生成 token（这里简单模拟）
////        String token = "token_" + user.getUserId();
////
////        // 返回用户信息和 token
////        return new ApiResponse(true, "登录成功", new LoginResponse(user, token));
//
//        return null;
//    }

@PostMapping("/phone")
@ApiOperation("微信手机号授权登录")
public Result<LoginVO> loginByPhone(@RequestBody WechatPhoneLoginDTO loginDTO) {
    log.info("微信手机号授权登录：{}", loginDTO);
    User user = userService.loginByPhoneNumber(loginDTO);
    return buildLoginResult(user);
}

    private Result<LoginVO> buildLoginResult(User user) {
        // 生成JWT令牌（沿用原有逻辑）
        HashMap<String, Object> claims = new HashMap<>();
        claims.put(JwtClaimsConstant.USER_ID, user.getId());
        String token = JwtUtil.createJWT(
                openProperties.getAppSecret(),
                jwtProperties.getAdminTtl(),
                claims
        );

        LoginVO loginVO = LoginVO.builder()
                .id(user.getId())
                .openid(user.getOpenid())
                .token(token)
                .build();

        return Result.success(loginVO);
    }





}
